import { judementSameArr } from "./arrayOperation";

/**
 * 获取用户信息
 */
function getUserInfo() {
  return uni.getStorageSync("userInfo");
}

/**
 * 确保用户信息结构完整的工具函数
 * @param userInfo 原始用户信息
 * @returns 处理后的用户信息
 */
export function ensureUserInfoStructure(userInfo: any) {
  if (!userInfo) {
    console.warn("用户信息为空，返回默认结构");
    return {
      Attributes: {
        Menus: [],
        Actions: [],
      },
    };
  }

  // 确保用户信息结构完整，特别是 Attributes.Actions 字段
  if (userInfo.Attributes) {
    if (!userInfo.Attributes.Actions) {
      userInfo.Attributes.Actions = [];
      console.warn("用户信息中缺少 Actions 字段，已设置为空数组");
    }
    if (!userInfo.Attributes.Menus) {
      userInfo.Attributes.Menus = [];
      console.warn("用户信息中缺少 Menus 字段，已设置为空数组");
    }
  } else {
    console.warn("用户信息结构不完整，设置默认结构");
    userInfo.Attributes = {
      ...userInfo?.Attributes,
      Menus: userInfo?.Attributes?.Menus || [],
      Actions: [],
    };
  }

  return userInfo;
}

/**
 * 单个权限验证
 * @param value 权限值
 * @returns 有权限，返回 `true`，反之则反
 */
export function auth(value: string): boolean {
  const stores = getUserInfo();

  // 检查用户信息是否存在以及 Actions 字段是否存在
  if (!stores || !stores.Attributes || !stores.Attributes.Actions || !Array.isArray(stores.Attributes.Actions)) {
    console.warn('用户信息或权限信息不完整，权限验证失败');
    return false;
  }

  // 转为小写后比较，实现不区分大小写的权限检查
  const lowerCaseValue = value.toLowerCase();
  return stores.Attributes.Actions.some((v: string) => v.toLowerCase() === lowerCaseValue);
}

/**
 * 多个权限验证，满足一个则为 true
 * @param value 权限值
 * @returns 有权限，返回 `true`，反之则反
 */
export function auths(value: Array<string>): boolean {
  const stores = getUserInfo();

  // 检查用户信息是否存在以及 Actions 字段是否存在
  if (!stores || !stores.Attributes || !stores.Attributes.Actions || !Array.isArray(stores.Attributes.Actions)) {
    console.warn('用户信息或权限信息不完整，权限验证失败');
    return false;
  }

  let flag = false;
  stores.Attributes.Actions.forEach((val: string) => {
    value.forEach((v: string) => {
      if (val === v) flag = true;
    });
  });
  return flag;
}

/**
 * 多个权限验证，全部满足则为 true
 * @param value 权限值
 * @returns 有权限，返回 `true`，反之则反
 */
export function authAll(value: Array<string>): boolean {
  const stores = getUserInfo();

  // 检查用户信息是否存在以及 Actions 字段是否存在
  if (!stores || !stores.Attributes || !stores.Attributes.Actions || !Array.isArray(stores.Attributes.Actions)) {
    console.warn('用户信息或权限信息不完整，权限验证失败');
    return false;
  }

  return judementSameArr(value, stores.Attributes.Actions);
}
